<!doctype html>



  


<html class="theme-next muse use-motion">
<head>
  <meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>



<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />












  
  
  <link href="/vendors/fancybox/source/jquery.fancybox.css?v=2.1.5" rel="stylesheet" type="text/css" />




  
  
  
  

  
    
    
  

  

  

  

  

  
    
    
    <link href="//fonts.googleapis.com/css?family=Lato:300,300italic,400,400italic,700,700italic&subset=latin,latin-ext" rel="stylesheet" type="text/css">
  






<link href="/vendors/font-awesome/css/font-awesome.min.css?v=4.4.0" rel="stylesheet" type="text/css" />

<link href="/css/main.css?v=5.0.1" rel="stylesheet" type="text/css" />


  <meta name="keywords" content="java," />








  <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico?v=5.0.1" />






<meta name="description" content="接口中不能有实现？接口中可以有实现（匿名类的方式），但是接口中不建议有实现，因为接口象征着一种契约，约束实现着，保证提供的服务的稳定性，可靠性。
123456789101112interface A &amp;#123;    void doSomeThing();&amp;#125;interface B&amp;#123;    A a = new A()&amp;#123;        @Override">
<meta property="og:type" content="article">
<meta property="og:title" content="java编程建议">
<meta property="og:url" content="http://yoursite.com/2016/08/29/java编程建议-1/index.html">
<meta property="og:site_name" content="个人博客">
<meta property="og:description" content="接口中不能有实现？接口中可以有实现（匿名类的方式），但是接口中不建议有实现，因为接口象征着一种契约，约束实现着，保证提供的服务的稳定性，可靠性。
123456789101112interface A &amp;#123;    void doSomeThing();&amp;#125;interface B&amp;#123;    A a = new A()&amp;#123;        @Override">
<meta property="og:updated_time" content="2017-01-19T07:14:13.280Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="java编程建议">
<meta name="twitter:description" content="接口中不能有实现？接口中可以有实现（匿名类的方式），但是接口中不建议有实现，因为接口象征着一种契约，约束实现着，保证提供的服务的稳定性，可靠性。
123456789101112interface A &amp;#123;    void doSomeThing();&amp;#125;interface B&amp;#123;    A a = new A()&amp;#123;        @Override">



<script type="text/javascript" id="hexo.configuration">
  var NexT = window.NexT || {};
  var CONFIG = {
    scheme: 'Muse',
    sidebar: {"position":"left","display":"post"},
    fancybox: true,
    motion: true,
    duoshuo: {
      userId: 0,
      author: '博主'
    }
  };
</script>




  <link rel="canonical" href="http://yoursite.com/2016/08/29/java编程建议-1/"/>

  <title> java编程建议 | 个人博客 </title>
</head>

<body itemscope itemtype="http://schema.org/WebPage" lang="zh-Hans">

  










  
  
    
  

  <div class="container one-collumn sidebar-position-left page-post-detail ">
    <div class="headband"></div>

    <header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-meta ">
  

  <div class="custom-logo-site-title">
    <a href="/"  class="brand" rel="start">
      <span class="logo-line-before"><i></i></span>
      <span class="site-title">个人博客</span>
      <span class="logo-line-after"><i></i></span>
    </a>
  </div>
  <p class="site-subtitle">随便写点什么</p>
</div>

<div class="site-nav-toggle">
  <button>
    <span class="btn-bar"></span>
    <span class="btn-bar"></span>
    <span class="btn-bar"></span>
  </button>
</div>

<nav class="site-nav">
  

  
    <ul id="menu" class="menu">
      
        
        <li class="menu-item menu-item-home">
          <a href="/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-home"></i> <br />
            
            首页
          </a>
        </li>
      
        
        <li class="menu-item menu-item-categories">
          <a href="/categories" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-th"></i> <br />
            
            分类
          </a>
        </li>
      
        
        <li class="menu-item menu-item-about">
          <a href="/about" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-user"></i> <br />
            
            关于
          </a>
        </li>
      
        
        <li class="menu-item menu-item-archives">
          <a href="/archives" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-archive"></i> <br />
            
            归档
          </a>
        </li>
      
        
        <li class="menu-item menu-item-tags">
          <a href="/tags" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-tags"></i> <br />
            
            标签
          </a>
        </li>
      

      
    </ul>
  

  
</nav>

 </div>
    </header>

    <main id="main" class="main">
      <div class="main-inner">
        <div class="content-wrap">
          <div id="content" class="content">
            

  <div id="posts" class="posts-expand">
    

  
  

  
  
  

  <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
            
            
              
                java编程建议
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">
            <span class="post-meta-item-icon">
              <i class="fa fa-calendar-o"></i>
            </span>
            <span class="post-meta-item-text">发表于</span>
            <time itemprop="dateCreated" datetime="2016-08-29T17:29:12+08:00" content="2016-08-29">
              2016-08-29
            </time>
          </span>

          
            <span class="post-category" >
              &nbsp; | &nbsp;
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              <span class="post-meta-item-text">分类于</span>
              
                <span itemprop="about" itemscope itemtype="https://schema.org/Thing">
                  <a href="/categories/java/" itemprop="url" rel="index">
                    <span itemprop="name">java</span>
                  </a>
                </span>

                
                

              
            </span>
          

          
            
              <span class="post-comments-count">
                &nbsp; | &nbsp;
                <a href="/2016/08/29/java编程建议-1/#comments" itemprop="discussionUrl">
                  <span class="post-comments-count ds-thread-count" data-thread-key="2016/08/29/java编程建议-1/" itemprop="commentsCount"></span>
                </a>
              </span>
            
          

          

          
          

          
        </div>
      </header>
    


    <div class="post-body" itemprop="articleBody">

      
      

      
        <h2 id="接口中不能有实现？"><a href="#接口中不能有实现？" class="headerlink" title="接口中不能有实现？"></a>接口中不能有实现？</h2><p>接口中可以有实现（匿名类的方式），但是接口中不建议有实现，因为接口象征着一种契约，约束实现着，保证提供的服务的稳定性，可靠性。</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line"><span class="class"><span class="keyword">interface</span> <span class="title">A</span> </span>&#123;</div><div class="line">    <span class="function"><span class="keyword">void</span> <span class="title">doSomeThing</span><span class="params">()</span></span>;</div><div class="line">&#125;</div><div class="line"><span class="class"><span class="keyword">interface</span> <span class="title">B</span></span>&#123;</div><div class="line">    A a = <span class="keyword">new</span> A()&#123;</div><div class="line"></div><div class="line">        <span class="meta">@Override</span></div><div class="line">        <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">doSomeThing</span><span class="params">()</span> </span>&#123;</div><div class="line">            System.out.println(<span class="string">"in B"</span>);</div><div class="line">        &#125;</div><div class="line">    &#125;;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<a id="more"></a>
<h2 id="序列化"><a href="#序列化" class="headerlink" title="序列化"></a>序列化</h2><p>在实现序列化接口的类中定义一个Long型的UUID的目的是为了避免对象不一致，起到一定的欺骗JVM的作用<br>若是我们不显示定义这个UUUD，JVM会自动生成一个，用于在序列化与反序列化之间判断对象是否一致的标准，现有如此情况，都是类A，但是机器B上的类A版本比较高，新添加了一些属性，但是这些属性又是不太重要的，相比于序列化失败，他们都是可以容忍的，那么，如果不显示定义UUID，就会抛出非法类型的异常，只有显示定义了UUID，欺骗JVM说是对象一致，才可以完成反序列化，只是反序列化之后的对象无法读取到那些新的业务属性</p>
<p>反序列化时，不会调用起构造函数，而是根据序列化后的类信息直接开辟出相应的空间，附上相应的值</p>
<p>反序列化时final类型的成员如果想被重新赋值，那么，这个值比如是8个基本类型，再包括String，数组 这些类型中的一个</p>
<p>final修饰的变量是 1.构造函数赋值 2.方法赋值 3.复杂对象 时，反序列化不会被重新赋值 ， 因为序列化后的文件不记录方法的具体实现</p>
<h2 id="静态方法不能覆写"><a href="#静态方法不能覆写" class="headerlink" title="静态方法不能覆写"></a>静态方法不能覆写</h2><p>静态方法的访问入口是类，而不是类实例，通过类实例去调用静态方法时，会根据该实例的声明类型区尝试访问<br>如：类A extends B<br>A,B中有同一个静态方法，<br>B b = new A（）；<br>用b去访问静态方法，访问到的是B中的静态方法，因为b的声明类型是B</p>
<p>所谓静态方法不能覆写，我们要关注的是，何为覆写，覆写表现为@Override，用于非静态方法<br>而父类与子类拥有相同的静态方法，最多只能说是隐藏，子类的静态方法隐藏了父类的静态方法</p>
<h2 id="匿名类的构造函数"><a href="#匿名类的构造函数" class="headerlink" title="匿名类的构造函数"></a>匿名类的构造函数</h2><p>构造块：”{}”<br>构造块里的东西会插到构造函数中的第一条代码的位置去执行（super在其前面）<br>相当于：<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div></pre></td><td class="code"><pre><div class="line">&#123;<span class="keyword">int</span> a = <span class="number">1</span>&#125;</div><div class="line"></div><div class="line"><span class="keyword">public</span> A（）&#123;</div><div class="line"><span class="keyword">int</span> c = <span class="number">2</span>；</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="comment">//等价于：</span></div><div class="line"></div><div class="line"><span class="keyword">public</span> A（）&#123;</div><div class="line"><span class="keyword">int</span> a = <span class="number">1</span>；</div><div class="line"><span class="keyword">int</span> c = <span class="number">2</span>；</div><div class="line">&#125;</div><div class="line"></div><div class="line"></div><div class="line">l1 = <span class="keyword">new</span> ArrayList();	<span class="comment">//普通ArrayList对象</span></div><div class="line">l2 = <span class="keyword">new</span> ArrayList()&#123;&#125;;	<span class="comment">//继承与ArrayList的匿名类，但是没有覆写任何方法</span></div><div class="line">l3 = <span class="keyword">new</span> ArrayList()&#123;&#123;&#125;&#125;;	<span class="comment">//同样是继承与ArrayList的匿名类，但是加入了构造方法，匿名类没有构造函数，所有用&#123;&#125;构造函数块来代替构造方法，同理可以这样声明 l3 = new ArrayList()&#123;&#123;&#125;&#123;&#125;&#123;&#125;&#123;&#125;&#125;;</span></div></pre></td></tr></table></figure></p>
<p>l1 l2 l3 类型是不相等的<br>l1好说，大家都知道<br>l2与l3，因为声明的是两个匿名类，所以虽然父类相同，但实际类型是不同的</p>
<p>匿名类在调用构造函数块时，会调用其父类的同参构造函数（一般类默认的是super()，如果不显示声明的，调用的就是父类的无参构造）<br>即：<br>A a = new A（1，2）{…}<br>此时声明了一个匿名类，继承与A，调用的构造是A中含有两个参数切类型对应的构造方法</p>
<h2 id="浅拷贝规则"><a href="#浅拷贝规则" class="headerlink" title="浅拷贝规则"></a>浅拷贝规则</h2><p>对于基本类型，拷贝其值<br>对于实例对象，拷贝其引用  也就是说，clone出来的对象虽然是两个不同的对象，但是如果该对象内的变量含有实例对象，那么clone出来的对象与源对象共同持有该实例对象的引用<br>对于String类型，行为与基本类型一致，虽然拷贝的也是地址，也就是引用，但是给clone出来的对象赋值时，却是重新生成一个</p>
<p>clone对象：A— clone —&gt;A1<br>成员属性： int1 — 重新生成 -&gt; int2<br>实例对象b - 赋值引用地址 -&gt; 实例对象b</p>
<h2 id="关于“覆写equals方法时，一定要覆写hashCode方法”的解释"><a href="#关于“覆写equals方法时，一定要覆写hashCode方法”的解释" class="headerlink" title="关于“覆写equals方法时，一定要覆写hashCode方法”的解释"></a>关于“覆写equals方法时，一定要覆写hashCode方法”的解释</h2><p>场景：<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div></pre></td><td class="code"><pre><div class="line"><span class="class"><span class="keyword">class</span> <span class="title">C</span></span>&#123;</div><div class="line"><span class="keyword">private</span> String name;</div><div class="line">    <span class="function"><span class="keyword">public</span> <span class="title">C</span><span class="params">()</span></span>&#123;&#125;</div><div class="line">    <span class="function"><span class="keyword">public</span> <span class="title">C</span><span class="params">(String name)</span></span>&#123;</div><div class="line">        <span class="keyword">this</span>.name = name;</div><div class="line">    &#125;</div><div class="line">    <span class="meta">@Override</span></div><div class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">equals</span><span class="params">(Object obj)</span> </span>&#123;</div><div class="line">        <span class="keyword">return</span> ((C)obj).getName().equals(name);</div><div class="line">    &#125;</div><div class="line">&#125;</div><div class="line"></div><div class="line"> 	 ArrayList&lt;C&gt; list = <span class="keyword">new</span> ArrayList&lt;&gt;();</div><div class="line">        list.add(<span class="keyword">new</span> C(“A”));</div><div class="line">        System.out.println(list.contains(<span class="keyword">new</span> C(“A”)));</div><div class="line">        map.put(<span class="keyword">new</span> C(“A”),<span class="keyword">new</span> Object());</div><div class="line">        System.out.println(map.containsKey(<span class="keyword">new</span> C(“A”)));</div></pre></td></tr></table></figure></p>
<p>输出结果 true false</p>
<p>首先，覆写了equals，判断相等的条件为name是否相等<br>在list中比对时，没有用到hashcode，而是逐个比对name属性，所以存在<br>而在map中比较特殊，我们知道hashmap在存储数据的形式上是用链表法来做到，链表头都是存在与一个数组内，put进去一个对象，根据其hashcode散列到不同的数组位置，然后插入链表<br>而containsKey同理，根据传入key的dashcode进行散列，然后在链表中进行查找是否equals<br>存在的问题就是我们如果不覆写hashcode，那么两次new C()产生的hashcode肯定是不同的，结果就是在map中找不到<br>基于这类情况所以要求覆写equals时覆写hashcode<br>不过也不是说一定要覆写，equals默认是用 == 进行比较，也就是比较地址<br>个人认为是否要覆写hashcode需要根据场景而定，不是说覆写了equals就一定要覆写hashcode，比如list的这个场景，就没有必要覆写hashcode<br>跟直白的说就是检索过程或者判断过程不需要用到hashcode的，就不必重写</p>
<h2 id="不要主动调用System-gc"><a href="#不要主动调用System-gc" class="headerlink" title="不要主动调用System.gc"></a>不要主动调用System.gc</h2><p>主动调用垃圾回收意味着系统需要让出资源，对于正在运行的业务可能存在影响，尤其是大型服务，一次gc可能需要几十秒甚至更多</p>
<h2 id="尽量不使用new-String"><a href="#尽量不使用new-String" class="headerlink" title="尽量不使用new String"></a>尽量不使用new String</h2><p>String s1 = “a”;<br>String s2 = “a”;<br>String s3 = new String(“a”);<br>String s4 = s3.intern();</p>
<p>s1 == s2  // true<br>s1 == s3  // false<br>s1 == s4  // true</p>
<p>虽然这个结果不难，但是需要知道String对象在生成过程中的一些问题。<br>首先String是一个final类，所有对String类型的数据进行操作返回String时，其实都是重新生成的一个对象<br>其次，String对象生成后就会被丢入字符串池，为的是防止大量String对象的产生<br>也就是说，String s1 = “a”; “a” 进入字符串池，<br>String s2 = “a”; 因为字符串池中已经有“a”了，所以没有在字符串池中创建新的String，而是拿出了“a”赋给s2<br>而String s3 = new String(“a”);不同，他不是创建在字符串池中的，它是在堆区中的<br>s3.intern() 检查字符串池中有没有与当前对象相同字面表达的字符串，有的话返回字符串池中该对象的地址，没的话将当前对象放到字符串池中并返回<br>如果，我们就知道了new String 与 String s = “a”;这种方式的区别<br>关键是在于减少内存的使用率</p>
<h2 id="字符串拼接"><a href="#字符串拼接" class="headerlink" title="字符串拼接"></a>字符串拼接</h2><p>String a = “a” + “b”;<br>String a += “c”;<br>String a = a.concat(“d”);</p>
<p>区别何在<br>String a = “a” + “b”;  // 编译时直接就是String a = “ab”;<br>String a += “c”;      // 编译时相当于 new StringBuilder(a).append(“c”).toString();  也就是说要创建两个对象 StringBuilder以及String<br>String a = a.concat(“d”); //内部做了数组拷贝，最后创建了一个String返回</p>
<p>大多数情况下我们都可以用+来完成拼接，当出现性能瓶颈的时候才考虑改变拼接方式</p>
<h2 id="字符串排序"><a href="#字符串排序" class="headerlink" title="字符串排序"></a>字符串排序</h2><p>对于中文字符的字符串排序，如果用Arrays.sort(strs)<br>那么，排序的一句是字符串转化为byte[],用每一位byte进行比较，但是结果也许不尽人意<br>Java推荐使用Collator进行排序<br>Comparator c = Collator.getInstance(Local.CHINA);<br>Arrays.sort(strs,c)</p>
<h2 id="数组，集合的效率问题"><a href="#数组，集合的效率问题" class="headerlink" title="数组，集合的效率问题"></a>数组，集合的效率问题</h2><p>拿求和问题来说<br>数组求和：<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">sum</span><span class="params">(<span class="keyword">int</span>[] list)</span></span>&#123;</div><div class="line">    <span class="keyword">int</span> sum = <span class="number">0</span>;</div><div class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> a : list)&#123;</div><div class="line">        sum += a;</div><div class="line">    &#125;</div><div class="line">    <span class="keyword">return</span> sum;</div><div class="line">&#125;</div></pre></td></tr></table></figure></p>
<p>集合元素求和：<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">sum</span><span class="params">(List&lt;Integer&gt; list)</span></span>&#123;</div><div class="line">    <span class="keyword">int</span> sum = <span class="number">0</span>;</div><div class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> a : list)&#123;</div><div class="line">        sum += a; <span class="comment">//这里做了自动拆箱，从Integer转为int</span></div><div class="line">    &#125;</div><div class="line">    <span class="keyword">return</span> sum;</div><div class="line">&#125;</div></pre></td></tr></table></figure></p>
<p>就基本类型而言，数组操作效率是远高于集合<br>原因有2：<br>1.基本类型存在于栈内存而非堆内存，栈内存的特点就是速度快，但容量小。对于集合来说，存的都是基本类型的包装类型，所以存在于堆内存<br>2.计算是集合要做一个拆箱操作，产生性能损耗</p>
<h2 id="原始类型数组不能作为asList的参数"><a href="#原始类型数组不能作为asList的参数" class="headerlink" title="原始类型数组不能作为asList的参数"></a>原始类型数组不能作为asList的参数</h2><p>asList(T.. . a) //可变参数<br>但是8个基本类型是不能作为泛型参数的<br>所以如果用int[]作为参数的话，无论数组中有多少个元素，产生的List只有一个元素，就是这个数组对象</p>
<h2 id="asList产生的List不可更改"><a href="#asList产生的List不可更改" class="headerlink" title="asList产生的List不可更改"></a>asList产生的List不可更改</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">public</span> <span class="keyword">static</span> &lt;T&gt; <span class="function">List&lt;T&gt; <span class="title">asList</span><span class="params">(T... a)</span> </span>&#123;</div><div class="line">        <span class="keyword">return</span> <span class="keyword">new</span> ArrayList&lt;&gt;(a);</div><div class="line">    &#125;</div></pre></td></tr></table></figure>
<p>需要注意的是这里的ArrayList不是java.util.ArrayList而是Arrays定义的一个内部类，它没有实现add方法<br>一般可以说，用asList生成的数组只适用于读操作或者重置某个元素，只要不设计add都是可以的</p>
<h2 id="for与foreach"><a href="#for与foreach" class="headerlink" title="for与foreach"></a>for与foreach</h2><p>List<integer> data<br>for(int i = 0; i &lt; data.size(); i++){}<br>for(int i : data)  等价于  for(Iterator<integer> i = list.iterator(); i.hasNext(); )<br>所以可以得出一个结论<br>用foreach并不是效率最高的<br>比如ArrayList（继承了RandomAcesses）可以随机访问，其实也就是说元素之间并没有什么关系，与之形成对比的就是LinkedList，元素之前有前后节点之说<br>这里就不多说ArrayList与LinkedList之间的区别的，大家基本都知道，一个适合随机读写，一个适合大量插入<br>比如data是ArrayList，用foreach的时候，强行给没有关系的数据之间联系起来，看起来就是画蛇添足，必然就慢了<br>但是如果是LinkedList，用for来遍历，就变成硬是将数据间有关联的集合变成了随机访问的集合，要知道LinkedList的get方法是一个类似于2分查找的过程，一次get就是一次遍历。。何谈性能<br>所以for与foreach如何取舍要视具体的情况而定<br>因为linkedlist是基于链表而非list，所以没有数组索引index这个概念，但是提供的get（int index）这样的方法，那只能通过遍历来实现，比如get(5)<br>linkedlist先判断5是比 size/2 小还是大（size是链表长度），如果小，从头开始遍历，最多查size/2次。如果大，从尾开始遍历，也是最多查size/2次。<br>查找下一个节点就像链表一样用的是e.next，前一个节点 e.prev。所以说linkedlist的查找很慢，就是因为没有下标index的概念，要一个个查.<br>同样，我们说linkedlist的删除快，不是说整个删除过程快，而是删除这个动作快，只需要改变指针指向就可以，但是删除前的准备（找到要删除的元素），还是很慢的，因为依旧要做一次上述的遍历</integer></integer></p>
<p>总的来说，linkedlist与arraylist的性能差距就是在于linkedlist遍历费时（add，get，delete都会涉及到遍历），arraylist可能会涉及到数据搬家（在中间插入，删除）或者扩容</p>
<h2 id="集合中元素交换顺序或者打乱顺序"><a href="#集合中元素交换顺序或者打乱顺序" class="headerlink" title="集合中元素交换顺序或者打乱顺序"></a>集合中元素交换顺序或者打乱顺序</h2><p>用Random产生一个随机数，将下标为i的元素与Random产生的元素互换位置，用一个中间变量temp来过度<br>用Collections.swap(Collection, srcInt, tagInt) 用Collections提供的swap来交换<br>Collections.shuffle(collection)直接打乱集合</p>
<h2 id="hashMap尽量不要放太多数据"><a href="#hashMap尽量不要放太多数据" class="headerlink" title="hashMap尽量不要放太多数据"></a>hashMap尽量不要放太多数据</h2><p>hashmap放太多数据很有可能会导致内存溢出，因为hashmap的扩容方式与list不同，像arraylist是不够了在扩，扩1.5倍。而hashmap是当前map元素大于 桶槽数<em>0.75 就进行resize扩容，直接扩充2倍，桶槽数就是table数组的长度，默认初始长度16，扩容阈值12.如此一来当我们桶槽数到达2^19次 524288时，map里的元素到达393217（比524288</em>0.75 多1）就要进行扩容，而且直接扩容到100W以上，也就是说此次扩容需要申请长度为100W以上的数组，非常消耗内存空间，所以建议不要用hashmap来存储大量数据，尽管数据本身是简短的string，但被包装后就形成了一个对象（hashmap内是用entry实例来保存键值对，前后节点等信息的，）<br>tips:hashmap的长度永远是2的n次幂，为啥，因为这样可以最大化的利用table的每一个位置，2^n - 1 的二进制是 11…11 全是1，这种情况，任何hash值与之进行&amp;时，可能产生的结果就是0~2^n - 1，正好覆盖table的所有元素。而当table长度不是2^n时，可能产生的结果就是table中有几个位置永远不会被hash到。</p>
<h2 id="集合中的线程安全与线程同步"><a href="#集合中的线程安全与线程同步" class="headerlink" title="集合中的线程安全与线程同步"></a>集合中的线程安全与线程同步</h2><p>线程安全是指多线程并发访问修改时，不会出现数据不一致的情况<br>线程同步是为了保护集合中的数据不被脏读脏写而产生的（同一个方法同一时间只允许一个线程进入）<br>比如：<br>ConcurrentModificationException是因为可能被多个线程修改并访问，这个跟集合是否是线程安全的无关（Vectory，HashTable），实现原理就是当线程在读列表时，发现modCount改变了，也就是被修改了，就会抛出此异常，为的是保证集合方法一致性。否则产生的后果就是A读取的集合跟B读取的集合内容不一致。<br>WeakHashMap采用弱键方式实现的hashmap，特点就是WeakHashMap对象的存在并不会影响GC对键值对的回收，也就是说不用担心内存溢出的问题，GC会自动回收不用的键值对，但是隐患就是我们不知道什么时候发生GC回收<br>EnumSet的两个实现子类 RegularEnumSet与JumboEnumSet  特点是RegularEnumSet适用于枚举数少于等于64的情况，它用一个long型来表示所有枚举，效率跟飞一样，JumboEnumSet是以64个为一组，用多个long型来表示所有的枚举，所以建议枚举不要超64个，否则建议分组</p>
<h2 id="泛型边界"><a href="#泛型边界" class="headerlink" title="泛型边界"></a>泛型边界</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">List&lt;? <span class="keyword">super</span> T&gt;</div></pre></td></tr></table></figure>
<p>  get:不适用，因为我只知道集合内元素的父类是T，但是我不知道具体是哪个类型的元素，比如T为Number，集合内可能有Integer，Double，Long等类型，但是我不知道具体是哪个类型，所以无法进行计算<br>  set：适用，因为我能唯一确定集合内的所有元素的父类是T，比如Number，无论我add的是Integer，Long，Double，他们的父类都是Number<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">List&lt;? extends T&gt;</div></pre></td></tr></table></figure></p>
<p>  get：适用，比如T为Number，因为我知道集合内地元素肯定是T的子类，所以可以进行一些业务操作（因为这之前，编译器已经确定了唯一的编译类型，也就是说元素通常都是一个类型，要么都是Integer，要么都是Double…）<br>  set：不适用，因为我知道的仅仅是集合内的元素是Number的子类，但是我不知道到底是什么元素，编译器无法确定实际的编译类型，所以不能set</p>
<p>以此，说明集合的上界(读取界限)由 extends来确定， 下界(新增界限)由super来确定</p>
<p>就像我们说List<integer>不是List<number>的子类一样，他们是两个容器，一个用于存放Integer元素的容器，另一个是用于存放Number元素的容器，处于同一层面<br>将泛型集合转换成泛型数组时，泛型数组的真实类型只能是泛型集合的子类，否则抛出类型转换错误<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">String[] str = &#123;“A”, “B”&#125;;</div><div class="line">Object[] obj = str;</div></pre></td></tr></table></figure></number></integer></p>
<p>obj的真实类型是String[]<br>也就是说List<t>转换成泛型数组时E[],E必须是T的实际子类</t></p>
<h2 id="反射的Accessible"><a href="#反射的Accessible" class="headerlink" title="反射的Accessible"></a>反射的Accessible</h2><p>当我们要使用一个非public方法或者字段时，需要开放权限，一般就是setAccessible（true）<br>但是Accessible=true可以当做是用来判断方法或字段可以被使用的标准吗？不能<br>Accessible只是作为是否执行java安全机制的标识位<br>例如：<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">public</span> <span class="keyword">final</span> <span class="keyword">void</span> show（）&#123;</div><div class="line">  Sysout.out.println(“show”);</div><div class="line">&#125;</div></pre></td></tr></table></figure></p>
<p>该方法在反射时直接就可以用，但是Accessible为false<br>所以Accessible只是作为是否执行安全机制的标识而不是说方法或字段是否可以的依据</p>
<h2 id="反射中的类对象"><a href="#反射中的类对象" class="headerlink" title="反射中的类对象"></a>反射中的类对象</h2><p>类对象有三种获取方式：<br>  1.new String().getClass();<br>  2.String.class;<br>  3.class.forName(“java.lang.String”);</p>
<p>这里来说明下class.forName(“java.lang.String”) 这个东西到底做了干了什么<br>首先它肯定是讲一个类加载到了内存中，这种做法比较常见的就是jdbc中， class.forName(“com.mysql.jdbc.Driver”);<br>但要知道的是它保证的只是将一个类加载到内存中，并不保证产生一个实例对象或者做一些操作，但是它会执行静态块（这不是由class.forName决定的，而是由类的加载机制决定的）<br>所以class.forName的价值就是类被加载到内存后执行的static{}<br>比如jdbc，他做的就是将自己注册到ConnectManager中去</p>
<p>数组是比较特殊的类，无法通过一般的反射来动态创建，比较好的方式就是通过Array数组反射工具来间接完成<br>String[] str = (String[])Array.newInstance(String.class, 2);</p>
<h2 id="反射与动态代理"><a href="#反射与动态代理" class="headerlink" title="反射与动态代理"></a>反射与动态代理</h2><p>动态代理的基本原理就是依靠反射实现的，而依赖于动态代理，我们也可以构建出装饰模式<br>反射效率低（正常代码是反射执行效率的15倍），但是不代表说因为效率的就不要使用它，相反，如果代码结构清晰，具有十分好的可读性，那么使用反射也无可厚非<br>动态代理-代理模式 示例代码：<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">DynamicProxy</span> <span class="keyword">implements</span> <span class="title">InvocationHandler</span> </span>&#123;</div><div class="line">    <span class="keyword">private</span> Execute demo;</div><div class="line">    <span class="function"><span class="keyword">public</span> <span class="title">DynamicProxy</span><span class="params">(Execute demo)</span></span>&#123;</div><div class="line">        <span class="keyword">this</span>.demo = demo;</div><div class="line">    &#125;</div><div class="line"></div><div class="line">    <span class="meta">@Override</span></div><div class="line">    <span class="function"><span class="keyword">public</span> Object <span class="title">invoke</span><span class="params">(Object proxy, Method method, Object[] args)</span> <span class="keyword">throws</span> Throwable </span>&#123;</div><div class="line">        before();</div><div class="line">        Object obj = method.invoke(demo,args);</div><div class="line">        after();</div><div class="line">        <span class="keyword">return</span> obj;</div><div class="line">    &#125;</div><div class="line"></div><div class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">before</span><span class="params">()</span></span>&#123;</div><div class="line">        System.out.println(<span class="string">"start proxy"</span>);</div><div class="line">    &#125;</div><div class="line"></div><div class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">after</span><span class="params">()</span></span>&#123;</div><div class="line">        System.out.println(<span class="string">"after proxy"</span>);</div><div class="line">    &#125;</div><div class="line"></div><div class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>&#123;</div><div class="line">        Execute demo = <span class="keyword">new</span> ProxyDemo();</div><div class="line">        InvocationHandler handler = <span class="keyword">new</span> DynamicProxy(demo);</div><div class="line">        Execute proxy = (Execute)Proxy.newProxyInstance(</div><div class="line">                demo.getClass().getClassLoader(),</div><div class="line">                demo.getClass().getInterfaces(),handler);</div><div class="line">        proxy.show();</div><div class="line">    &#125;</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="class"><span class="keyword">class</span> <span class="title">ProxyDemo</span> <span class="keyword">implements</span> <span class="title">Execute</span></span>&#123;</div><div class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">show</span><span class="params">()</span></span>&#123;</div><div class="line">        System.out.println(<span class="string">"this is ProxyDemo"</span>);</div><div class="line">    &#125;</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="class"><span class="keyword">interface</span> <span class="title">Execute</span></span>&#123;</div><div class="line">    <span class="function"><span class="keyword">void</span> <span class="title">show</span><span class="params">()</span></span>;</div><div class="line">&#125;</div></pre></td></tr></table></figure></p>
<p>装饰模式也是类似，动态代理很容易实现通用类，同时，动态代理也是AOP的实现原理之一</p>
<h2 id="异常finally的执行"><a href="#异常finally的执行" class="headerlink" title="异常finally的执行"></a>异常finally的执行</h2><p>首先明确finally的执行时机，准确的说是在return执行后，数据返回前被调用的，我们知道方法是在栈区运行的（一个先进后出的模型），也就是说，finally是在return执行完后将产生的结果放入栈帧中，然后再被执行的<br>既然这样，这里就又要说引用类型与值类型了，像基本类型以及String类型，传递过程中都是值拷贝,所以有句话说形参的改变不影响实参，值得就是基本类型与String类型传递后，改变他们的值，不会对原值产生影响，因为从内存来说他们是两份数据，互不干扰。但是引用类型就不一样了，如果return的是一个引用类型，那么栈帧中存的其实是该实例的地址。<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">show</span><span class="params">(<span class="keyword">int</span> i)</span> <span class="keyword">throws</span> DataFormatException </span>&#123;</div><div class="line">        <span class="keyword">try</span> &#123;</div><div class="line">            <span class="keyword">if</span> (i &lt; <span class="number">0</span>) &#123;</div><div class="line">                <span class="keyword">throw</span> <span class="keyword">new</span> DataFormatException(<span class="string">"-1"</span>);</div><div class="line">            &#125; <span class="keyword">else</span> &#123;</div><div class="line">                <span class="keyword">return</span> i;</div><div class="line">            &#125;</div><div class="line">        &#125;<span class="keyword">catch</span> (DataFormatException e)&#123;</div><div class="line"></div><div class="line">        &#125;<span class="keyword">finally</span> &#123;</div><div class="line">            <span class="keyword">return</span> -<span class="number">1</span>;</div><div class="line">        &#125;</div><div class="line">    &#125;</div></pre></td></tr></table></figure></p>
<p>这段代码在finally块中也有一个return，根据上面说的finally的执行时机，finally中的return会覆盖掉之前的return</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">show</span><span class="params">()</span> <span class="keyword">throws</span> DataFormatException </span>&#123;</div><div class="line">        <span class="keyword">int</span> i = <span class="number">1</span>;</div><div class="line">        <span class="keyword">try</span> &#123;</div><div class="line">            <span class="keyword">if</span> (i &lt; <span class="number">0</span>) &#123;</div><div class="line">                <span class="keyword">throw</span> <span class="keyword">new</span> DataFormatException(<span class="string">"-1"</span>);</div><div class="line">            &#125; <span class="keyword">else</span> &#123;</div><div class="line">                <span class="keyword">return</span> i;</div><div class="line">            &#125;</div><div class="line">        &#125;<span class="keyword">catch</span> (DataFormatException e)&#123;</div><div class="line"></div><div class="line">        &#125;<span class="keyword">finally</span> &#123;</div><div class="line">            i = <span class="number">2</span>;</div><div class="line">        &#125;</div><div class="line">        <span class="keyword">return</span> <span class="number">0</span>;</div><div class="line">    &#125;</div></pre></td></tr></table></figure>
<p>这段代码与上面的有何不同呢，这里在finally中尝试去修改i的值来改变return的值，根据之前说的return时数据是如何被操作的（一个栈的模型，先进后出），可以看到，如果return的是基本数据类型及String，改变其引用的值是不会对return的结果产生影响，但是如果return的值是引用类型，那么修改其值会对return值产生影响，因为引用类型在栈区存的是实例的地址，而基本类型及String在栈区存的是其值</p>
<p>同时，在finally中如果有return的另一个坏处就是，会屏蔽异常。当我们使用try时，JVM会起一个异常线程来监控程序是否有异常抛出，假设我们抛出了一个DataFormatException异常，异常线程检测到了该异常，将其注册，但执行到finally之后，他重新为该方法赋予返回值，也就是说它告诉JVM“这个方法执行没问题，且返回值是XXX”，如果一来异常就消失了，或者说逃逸了。对于上层代码而言就无法捕获到异常。</p>
<p>所以结论就是不要在finally中带上return</p>
<h2 id="多线程"><a href="#多线程" class="headerlink" title="多线程"></a>多线程</h2><p>stop方法是一种极端的关闭线程的方法，他会破坏线程当前的原子性，因为该操作会释放锁，当时这种释放不是预期的<br>比如：<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">synchronized</span>(“”)&#123;</div><div class="line">   a++</div><div class="line">   Thread.Sleep(<span class="number">1000</span>);</div><div class="line">   a—;</div><div class="line">&#125;</div></pre></td></tr></table></figure></p>
<p>在线程进入sleep时对其stop，a是线程共享的变量，原本a的值始终是0（先加再减，又是同步操作），但是此时stop线程后，会直接释放所有的锁，a++已经执行了，那么其他线程在拿到a的时候就成了1而不是原本的0，所以说stop会破坏线程的原子性。</p>
<p>关于线程优先级，总共有11级，0~10，但是0是JVM优先级，应用程序不允许使用，需要注意的是优先级代表的是线程获得CPU的机会大小，但这不是绝对的，比如优先级10与优先级9，两者相差不大，那么可能的结果就是交替执行，9可能优先于10运行。但是如果是10跟1，那么一般来说不会出现1先于10的情况，所以java的优先级相当于是一种整体的有序，但是对于优先级相近的级别，则可能出现无序。</p>
<p>自动重启的线程保障，实现UncaughtExceptionHandler并将其设置到线程内，当线程抛出异常时，该handle会启动，如果是不间断的业务线程，可以在handle中记录出当前错误后直接重启，保证业务的不间断。但是带来的隐患就是内存溢出以及一些逻辑问题</p>
<p>关于volatile，它只保证变量的可见性以及阻止默认的JVM重排序问题。但是不提供同步功能。线程写操作时，先写到工作内存，再有工作内存刷入主内存，读取时直接从工作内存读取。由此可见，默认情况下，线程更多的是与本地工作内存交互，这样就存在了数据被修改但是线程却不知道的情况。volatile的作用就是阻止线程与本地工作内存的交互，使线程的读写都是从主内存中进行，从而保证拿到的数据是当前主内存中最新的数据，但是仅仅是这样却不能保证操作的原子性，因为我拿到数据进行处理的过程中，不能保证其他线程没有对主内存写入新的值。</p>
<p>线程池的实现原理：BlockQueue，Worker，submit操作等</p>
<p>使用线程池时的任务进入流动，（假设任务源源不断）当前工作线程数小于核心线程数，则增加到核心线程数，继续有任务进来，加入阻塞队列，队列满了，增加线程数直至最大线程数，再有任务进来，丢弃、拒绝接受任务、挤占已存在的任务</p>
<p>显式锁与内部锁的区别：<br>  1.显式锁是对象级别的，而内部锁是类级别的<br>  2.显式锁的粒度小，比如读写锁支持读写分离，允许多个读，但是只允许一个写<br>  3.显示锁是无阻塞的，当线程拿不到锁时，进入的是等待（Wait）而不是阻塞（Block），内部锁是进入阻塞状态<br>  4.显示锁可实现公平锁（默认是非公平锁），内部锁只能是非公平<br>  5.显示锁是代码级别的，内部锁是JVM级别的（从某个角度来说，JVM级的内部锁在将来的优化程度可能更高）</p>

      
    </div>

    <div>
      
        

      
    </div>

    <div>
      
        

      
    </div>

    <footer class="post-footer">
      
        <div class="post-tags">
          
            <a href="/tags/java/" rel="tag">#java</a>
          
        </div>
      

      
        <div class="post-nav">
          <div class="post-nav-next post-nav-item">
            
              <a href="/2016/08/28/java定时任务（2）/" rel="next" title="java定时任务（2）">
                <i class="fa fa-chevron-left"></i> java定时任务（2）
              </a>
            
          </div>

          <div class="post-nav-prev post-nav-item">
            
              <a href="/2016/08/30/spring-boot日常文档/" rel="prev" title="spring boot日常文档">
                spring boot日常文档 <i class="fa fa-chevron-right"></i>
              </a>
            
          </div>
        </div>
      

      
      
    </footer>
  </article>



    <div class="post-spread">
      
    </div>
  </div>


          </div>
          


          
  <div class="comments" id="comments">
    
      <div class="ds-thread" data-thread-key="2016/08/29/java编程建议-1/"
           data-title="java编程建议" data-url="http://yoursite.com/2016/08/29/java编程建议-1/">
      </div>
    
  </div>


        </div>
        
          
  
  <div class="sidebar-toggle">
    <div class="sidebar-toggle-line-wrap">
      <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
    </div>
  </div>

  <aside id="sidebar" class="sidebar">
    <div class="sidebar-inner">

      

      
        <ul class="sidebar-nav motion-element">
          <li class="sidebar-nav-toc sidebar-nav-active" data-target="post-toc-wrap" >
            文章目录
          </li>
          <li class="sidebar-nav-overview" data-target="site-overview">
            站点概览
          </li>
        </ul>
      

      <section class="site-overview sidebar-panel ">
        <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
          <img class="site-author-image" itemprop="image"
               src="/uploads/touxiang.jpg"
               alt="钱伟峰" />
          <p class="site-author-name" itemprop="name">钱伟峰</p>
          <p class="site-description motion-element" itemprop="description">每天进步一点点</p>
        </div>
        <nav class="site-state motion-element">
          <div class="site-state-item site-state-posts">
            <a href="/archives">
              <span class="site-state-item-count">21</span>
              <span class="site-state-item-name">日志</span>
            </a>
          </div>

          
            <div class="site-state-item site-state-categories">
              <a href="/categories">
                <span class="site-state-item-count">7</span>
                <span class="site-state-item-name">分类</span>
              </a>
            </div>
          

          
            <div class="site-state-item site-state-tags">
              <a href="/tags">
                <span class="site-state-item-count">11</span>
                <span class="site-state-item-name">标签</span>
              </a>
            </div>
          

        </nav>

        

        <div class="links-of-author motion-element">
          
        </div>

        
        

        
        

      </section>

      
        <section class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active">
          <div class="post-toc">
            
              
            
            
              <div class="post-toc-content"><ol class="nav"><li class="nav-item nav-level-2"><a class="nav-link" href="#接口中不能有实现？"><span class="nav-number">1.</span> <span class="nav-text">接口中不能有实现？</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#序列化"><span class="nav-number">2.</span> <span class="nav-text">序列化</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#静态方法不能覆写"><span class="nav-number">3.</span> <span class="nav-text">静态方法不能覆写</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#匿名类的构造函数"><span class="nav-number">4.</span> <span class="nav-text">匿名类的构造函数</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#浅拷贝规则"><span class="nav-number">5.</span> <span class="nav-text">浅拷贝规则</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#关于“覆写equals方法时，一定要覆写hashCode方法”的解释"><span class="nav-number">6.</span> <span class="nav-text">关于“覆写equals方法时，一定要覆写hashCode方法”的解释</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#不要主动调用System-gc"><span class="nav-number">7.</span> <span class="nav-text">不要主动调用System.gc</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#尽量不使用new-String"><span class="nav-number">8.</span> <span class="nav-text">尽量不使用new String</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#字符串拼接"><span class="nav-number">9.</span> <span class="nav-text">字符串拼接</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#字符串排序"><span class="nav-number">10.</span> <span class="nav-text">字符串排序</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#数组，集合的效率问题"><span class="nav-number">11.</span> <span class="nav-text">数组，集合的效率问题</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#原始类型数组不能作为asList的参数"><span class="nav-number">12.</span> <span class="nav-text">原始类型数组不能作为asList的参数</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#asList产生的List不可更改"><span class="nav-number">13.</span> <span class="nav-text">asList产生的List不可更改</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#for与foreach"><span class="nav-number">14.</span> <span class="nav-text">for与foreach</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#集合中元素交换顺序或者打乱顺序"><span class="nav-number">15.</span> <span class="nav-text">集合中元素交换顺序或者打乱顺序</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#hashMap尽量不要放太多数据"><span class="nav-number">16.</span> <span class="nav-text">hashMap尽量不要放太多数据</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#集合中的线程安全与线程同步"><span class="nav-number">17.</span> <span class="nav-text">集合中的线程安全与线程同步</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#泛型边界"><span class="nav-number">18.</span> <span class="nav-text">泛型边界</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#反射的Accessible"><span class="nav-number">19.</span> <span class="nav-text">反射的Accessible</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#反射中的类对象"><span class="nav-number">20.</span> <span class="nav-text">反射中的类对象</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#反射与动态代理"><span class="nav-number">21.</span> <span class="nav-text">反射与动态代理</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#异常finally的执行"><span class="nav-number">22.</span> <span class="nav-text">异常finally的执行</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#多线程"><span class="nav-number">23.</span> <span class="nav-text">多线程</span></a></li></ol></div>
            
          </div>
        </section>
      

    </div>
  </aside>


        
      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="footer-inner">
        <div class="copyright" >
  
  &copy; 
  <span itemprop="copyrightYear">2017</span>
  <span class="with-love">
    <i class="fa fa-heart"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">钱伟峰</span>
</div>

<div class="powered-by">
  由 <a class="theme-link" href="https://hexo.io">Hexo</a> 强力驱动
</div>

<div class="theme-info">
  主题 -
  <a class="theme-link" href="https://github.com/iissnan/hexo-theme-next">
    NexT.Muse
  </a>
</div>

        

        
      </div>
    </footer>

    <div class="back-to-top">
      <i class="fa fa-arrow-up"></i>
    </div>
  </div>

  

<script type="text/javascript">
  if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
    window.Promise = null;
  }
</script>









  



  
  <script type="text/javascript" src="/vendors/jquery/index.js?v=2.1.3"></script>

  
  <script type="text/javascript" src="/vendors/fastclick/lib/fastclick.min.js?v=1.0.6"></script>

  
  <script type="text/javascript" src="/vendors/jquery_lazyload/jquery.lazyload.js?v=1.9.7"></script>

  
  <script type="text/javascript" src="/vendors/velocity/velocity.min.js?v=1.2.1"></script>

  
  <script type="text/javascript" src="/vendors/velocity/velocity.ui.min.js?v=1.2.1"></script>

  
  <script type="text/javascript" src="/vendors/fancybox/source/jquery.fancybox.pack.js?v=2.1.5"></script>


  


  <script type="text/javascript" src="/js/src/utils.js?v=5.0.1"></script>

  <script type="text/javascript" src="/js/src/motion.js?v=5.0.1"></script>



  
  

  
  <script type="text/javascript" src="/js/src/scrollspy.js?v=5.0.1"></script>
<script type="text/javascript" src="/js/src/post-details.js?v=5.0.1"></script>



  


  <script type="text/javascript" src="/js/src/bootstrap.js?v=5.0.1"></script>



  

  
    
  

  <script type="text/javascript">
    var duoshuoQuery = {short_name:"qianweifeng"};
    (function() {
      var ds = document.createElement('script');
      ds.type = 'text/javascript';ds.async = true;
      ds.id = 'duoshuo-script';
      ds.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') + '//static.duoshuo.com/embed.js';
      ds.charset = 'UTF-8';
      (document.getElementsByTagName('head')[0]
      || document.getElementsByTagName('body')[0]).appendChild(ds);
    })();
  </script>

  
    
    <script src="/vendors/ua-parser-js/dist/ua-parser.min.js?v=0.7.9"></script>
    <script src="/js/src/hook-duoshuo.js"></script>
  






  
  

  

  

  

</body>
</html>
